package com.mnt.gui.base.contorls.table;

import javafx.collections.ObservableList;
import javafx.scene.control.TableView;
import javafx.scene.layout.Pane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;

/**
 * 分页表格建筑类
 * <p>
 * 将table view提供分页功能
 * </p>
 * @author    Cico.Jiang
 * @version  2014年4月1日 上午11:29:34 Cico.Jiang .
 * @since   3.3
 * @param <M> 为model 类型
 */
public abstract class PageableTableViewBuilder<M>
{
	private int count;
	private TableView<M> tableView;
	private int pageSize;
	private int pageCount;
	private VBox hbPagingBar = new VBox();
	private PagingBar pagingBar;
	
	/**
	 * 
	 * @param tableView is table view 
	 * @param totalCount is total count
	 * @param pageSize is page size
	 */
	public PageableTableViewBuilder(TableView<M> tableView, int totalCount, final int pageSize) {
		if(pageSize == 0) {
			throw new IllegalAccessError("size 不能为 0");
		}
		this.tableView = tableView;
		this.count = totalCount;
		this.pageSize = pageSize;
		VBox.setVgrow(hbPagingBar, Priority.ALWAYS);
		configure();
	}
	
	/**
	 * 
	 * 为表格创建分页栏
	 * <p>
	 * 添加分页栏点击事件
	 * </p>
	 * @since 2014年4月1日 下午5:21:49 Cico.Jiang
	 */
	public final void build() {
		pagingBar = new PagingBar(pageCount, 5)
		{
			@Override
			protected void clickIndex(int index)
			{
				tableView.getItems().clear();
				setTotalCount(cacluPageCount());
				getDataByIndex(index - 1, pageSize, tableView.getItems());
			}
		};
		builderPagingBar();
	}
	
	/**
	 * 
	 * reload table date
	 * <p>
	 * use condition query
	 * </p>
	 * @create mnt.cico
	 */
	public final void rebuild() {
		if(null != pagingBar) {
			pagingBar.setTotalCount(cacluPageCount());
			getDataByIndex(0 ,pageSize, tableView.getItems());
		}
	}
	
	public int cacluPageCount() {
		final int count = getTotalCount();
		if(count % pageSize == 0) {
			pageCount = count / pageSize;
		} else {
			pageCount = count / pageSize + 1;
		}
		return pageCount;
	}
	
	/**
	 * 
	 * 获取分页的数据
	 * <p>
	 * 第一次获取数据也会执行
	 * </p>
	 * @since 2014年4月1日 上午11:30:28 Cico.Jiang
	 * @param index 传入索引
	 * @param size 传入大小
	 * @return
	 */
	protected abstract void getDataByIndex(int index, int size, final ObservableList<M> items);
	
	/**
	 * 
	 * <p>
	 * get total count
	 * </p>
	 * @create mnt.cico
	 * @return
	 */
	protected abstract int getTotalCount();
	
	/**
	 * 
	 * <p>
	 * 计算分页数
	 * </p>
	 * @since 2014年4月1日 下午5:19:38 Cico.Jiang
	 */
	private void configure() {
		if(count % pageSize == 0) {
			pageCount = count / pageSize;
		} else {
			pageCount = count / pageSize + 1;
		}
	}
	
	/**
	 * 
	 * 配置分页栏
	 * @since 2014年4月1日 下午5:19:54 Cico.Jiang
	 */
	private void builderPagingBar() {
		hbPagingBar.getStylesheets().add(PageableTableViewBuilder.class.getResource("css/PageableTableViewBuilder.css").toExternalForm());
		hbPagingBar.setLayoutX(tableView.getLayoutX());
		hbPagingBar.setLayoutY(tableView.getLayoutY());
		hbPagingBar.getStyleClass().add("hb-pageable-table");
		hbPagingBar.setPrefSize(tableView.getPrefWidth(), tableView.getPrefHeight());
		Pane pane = (Pane)tableView.getParent();
		pane.getChildren().remove(tableView);
		hbPagingBar.setSpacing(2);
		hbPagingBar.getChildren().addAll(tableView, pagingBar);
		pane.getChildren().add(hbPagingBar);
	}
	
	private void configureDragListener() {
		
	}
	
}
